#![feature(downcast_unchecked)]

use std::env::current_dir;

use common::LResult;
use lite_db::start_server;

#[tokio::main]
async fn main() -> LResult<()> {
    // let mut engine = MemEngine::create("test");
    // let session_ctx = SessionContext::new();
    // session_ctx.register_table("test", engine.table_provider()?).unwrap();
    // init_data(&mut engine).await?;
    // let df = session_ctx.sql("select * from test").await.unwrap();
    // let records = df.collect().await.unwrap();
    // println!("batch vec len: {}", records.len());
    // let batch = records.get(0).unwrap();
    // println!("records count: {}", batch.num_rows());
    // println!("fields count: {}", batch.num_columns());
    // let columns = batch.columns();
    // println!("schema: {}", batch.schema());
    // let tag_a_column = unsafe {
    //     columns[2].as_any().downcast_ref_unchecked::<UInt64Array>()
    // };
    // for i in 0..batch.num_rows() {
    //     if tag_a_column.is_null(i) {
    //         println!("tag_a: null");
    //     } else {
    //         println!("tag u64 value: {}", tag_a_column.value(i));
    //         let s: Symbol = tag_a_column.value(i).into();
    //         println!("tag_a: {:?}", s);
    //     }
    // }
    let pwd = current_dir().unwrap().into_os_string();
    println!("pwd: {}", pwd.to_str().unwrap());
    log4rs::init_file("conf/log4rs.yaml", Default::default()).unwrap();
    start_server().await
}

// async fn init_data(engine: &mut MemEngine) -> LResult<()> {
//     {
//         let tag: Symbol = "this_is_a_tag".try_into()?;
//         println!("tag: {:?}, u64: {}", tag, tag.get_value());
//         let e = Entry::new_builder("test")
//             .add_tag("tag_a".try_into()?, "this_is_a_tag".try_into()?)
//             .add_field("field_a".try_into()?, FieldValue::I64(12))
//             .add_field("field_c".try_into()?, FieldValue::String("aaa".into()))
//             .build()?;
//         engine.write(e).await?;
//     }
//     {
//         let e = Entry::new_builder("test")
//             .add_tag("tag_b".try_into()?, "a".try_into()?)
//             .add_field("field_b".try_into()?, FieldValue::I64(12))
//             .build()?;
//         engine.write(e).await?;
//     }
//     Ok(())
// }